/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.taobao.taobaowidget.expandabletext.spannablestring;



import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.text.GetChars;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;

/**
 * This is the class for text whose content is immutable but to which markup
 * objects can be attached and detached. For mutable text, see
 * {@link SpannableStringBuilder}.
 */
public class ExpandableSpannableString extends SpannableStringInternal implements CharSequence,
        GetChars, Spannable {
    public ExpandableSpannableString(CharSequence source) {
        super(source, 0, source.length());
    }

    private ExpandableSpannableString(CharSequence source, int start, int end) {
        super(source, start, end);
    }

    public static ExpandableSpannableString valueOf(CharSequence source) {
        if (source instanceof ExpandableSpannableString) {
            return (ExpandableSpannableString)source;
        } else {
            return new ExpandableSpannableString(source);
        }
    }

    public void setSpan(Object what, int start, int end, int flags) {
        super.setSpan(what, start, end, flags);
    }

    public void removeSpan(Object what) {
        super.removeSpan(what);
    }

    public final CharSequence subSequence(int start, int end) {
        return new ExpandableSpannableString(this, start, end);
    }

    public void initilizeStyle(ExpandableTextStyle... whats) {
        mStyleObject = whats;
    }

    public void format(Object... args) {

        super.format(args);
        ExpandableTextStyle ets;
        for (int i = 0; i < args.length; i++) {
            ets = mStyleObject[i];
            if (args[i] instanceof Drawable) {
                if (ets == null) {
                    ets = new ExpandableTextStyle();
                }
                ets.setSpanStyle((Drawable)args[i], ImageSpan.ALIGN_BASELINE);
            }else if(args[i] instanceof Bitmap){
                if (ets == null) {
                    ets = new ExpandableTextStyle();
                }
                ets.setSpanStyle((Bitmap)args[i], ImageSpan.ALIGN_BASELINE);
            }
            for (int j = 0; j < ets.getCount(); j++) {
                super.setSpan(ets.getStyle(j), getStart(i), getEnd(i), ets.getFlags());
            }
        }
    }

    public void setStyle(int pos, ExpandableTextStyle style) {
        for (int i = 0; i < style.getCount(); i++) {
            super.setSpan(style.getStyle(i), getStart(pos), getEnd(pos), style.getFlags());
        }
    }

    private ExpandableTextStyle[] mStyleObject;

}
